package com.situ.company.util;

import java.io.IOException;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;

import org.json.JSONArray;
import org.json.JSONObject;


public class FmtRequest {
    
    /**
     * <p>Description: 根据请求的参数反射到实体类对象中</p>  
     * @param <T>
     *      需要反射生成的实体类对象
     * @param req
     *      请求对象
     * @param clazz
     *      需要反射的实体类的描述
     * @return T
     */
    public static <T> T parseModel(HttpServletRequest req, Class<T> clazz) {
        T obj = null;
        try {
            obj = clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
        Map<String, String[]> map = req.getParameterMap();
        for(Entry<String, String[]> entry : map.entrySet()) {
            String name = entry.getKey();
            if("action".equals(name))
                continue;
            try {
                Field field = clazz.getDeclaredField(name);
                field.setAccessible(true);
                field.set(obj, entry.getValue()[0]);
            } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
             }
        }
        return obj;
    }

    /**
     * <p>Description: 根据映射关系反射生成实体类对象</p>  
     * @param <T>
     *      需要反射生成的实体类对象
     * @param req
     *      请求对象
     * @param clazz
     *      需要反射的实体类的描述
     * @param fields
     *      key=属性名， value=参数名
     * @return T
     */
    public static <T> T parseModel(HttpServletRequest req, Class<T> clazz, Map<String, String> fields) {
        T obj = null;
        try {
            obj = clazz.newInstance();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
            return null;
        }
        for(Entry<String, String> entry : fields.entrySet()) {
            String name = entry.getKey();
            String val = req.getParameter(entry.getValue());
            try {
                Field field = clazz.getDeclaredField(name);
                field.setAccessible(true);
                field.set(obj, val);
            } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
                e.printStackTrace();
             }
        }
        return obj;
    }
    
    public static void write(Writer wr, String val) {
        try {
            wr.write(val);
            wr.flush();
            wr.close();
            wr = null;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void write(Writer wr, Object val) {
        if(val instanceof Collection<?>) {
            write(wr, new JSONArray((Collection<?>) val).toString());
        }else if(val instanceof String) {
            write(wr, val.toString());
        }else if(val instanceof Map<?, ?>) {
            write(wr, new JSONObject((Map<?,?>)val).toString());
        }else {
            write(wr, new JSONObject(val).toString());
        }
    }
   
}
